extends Area2D
class_name Portal

@export var target_scene: String = "res://scene/scene2.tscn"
@export var portal_id: String = "p1"  # 当前传送门的唯一ID
@export var target_portal_id: String = "p2"  # 目标场景中传送门的ID
@onready var sprite: Sprite2D = $Sprite2D
@onready var collision: CollisionShape2D = $CollisionShape2D
@onready var animation_player: AnimationPlayer = $AnimationPlayer

var player_in_portal: bool = false
var can_teleport: bool = true
var teleport_cooldown_timer: Timer
var cooldown_duration: float = 2.0  # 传送冷却时间（秒）

func _ready():
	body_entered.connect(_on_body_entered)
	body_exited.connect(_on_body_exited)
	
	# 设置传送门的碰撞检测层
	collision_layer = 0
	collision_mask = 1  # 检测玩家层
	
	# 创建冷却计时器
	teleport_cooldown_timer = Timer.new()
	teleport_cooldown_timer.wait_time = cooldown_duration
	teleport_cooldown_timer.one_shot = true
	teleport_cooldown_timer.timeout.connect(_on_cooldown_finished)
	add_child(teleport_cooldown_timer)
	
	# 播放传送门动画
	if animation_player:
		animation_player.play("portal_idle")
	
	# 注册传送门位置到场景管理器
	register_portal_position()
	
	# 检查是否刚刚传送到这里，如果是则启动冷却
	if SceneManager and SceneManager.just_teleported_to_portal == portal_id:
		start_cooldown()
		SceneManager.just_teleported_to_portal = ""

func _on_body_entered(body):
	# 检查是否是玩家（通过组或脚本检测）
	if (body.is_in_group("player") or body.has_method("move_and_slide")) and can_teleport:
		player_in_portal = true
		print("玩家进入传送门")
		teleport_player(body)
		# 播放传送门激活动画
		if animation_player:
			animation_player.play("portal_activate")

func _on_body_exited(body):
	# 检查是否是玩家（通过组或脚本检测）
	if body.is_in_group("player") or body.has_method("move_and_slide"):
		player_in_portal = false
		print("玩家离开传送门")
		# 播放传送门空闲动画
		if animation_player:
			animation_player.play("portal_idle")

func _input(event):
	if player_in_portal and event.is_action_pressed("ui_accept") and can_teleport:
		# 通过PlayerManager获取当前玩家
		var player = null
		if PlayerManager != null:
			player = PlayerManager.get_current_player()
		else:
			# 备用查找方法
			player = get_tree().get_first_node_in_group("player")
		if player != null:
			teleport_player(player)

func teleport_player(_player):
	if target_scene.is_empty():
		print("错误：未设置目标场景")
		return
	
	# 设置传送冷却
	start_cooldown()
	
	print("传送门激活，播放动画...")
	# 播放传送动画
	if animation_player:
		animation_player.play("portal_teleport")
		# 等待动画播放完成
		await animation_player.animation_finished
	else:
		# 如果没有动画播放器，等待固定时间
		await get_tree().create_timer(1.0).timeout
	
	# 使用场景管理器进行传送
	if SceneManager != null:
		SceneManager.teleport_to_scene(target_scene, target_portal_id)
	else:
		# 备用方案：直接切换场景
		print("场景管理器不可用，使用备用传送方案")
		get_tree().change_scene_to_file(target_scene)

func set_target_scene(scene_path: String):
	target_scene = scene_path

# 启动传送冷却
func start_cooldown():
	can_teleport = false
	teleport_cooldown_timer.start()
	print("传送门进入冷却状态，持续 ", cooldown_duration, " 秒")

# 冷却结束回调
func _on_cooldown_finished():
	can_teleport = true
	print("传送门冷却结束，可以再次使用")

# 注册传送门位置到场景管理器
func register_portal_position():
	# 等待场景完全加载
	await get_tree().process_frame
	
	if SceneManager != null:
		var current_scene = get_tree().current_scene
		var scene_path = current_scene.scene_file_path
		SceneManager.set_portal_position(scene_path, portal_id, global_position)
		print("传送门注册: ", portal_id, " 位置: ", global_position, " 场景: ", scene_path)
